package com.yanjr.common.persistence;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;

import com.mysql.jdbc.ResultSetMetaData;
import com.yanjr.common.utils.CamelCaseUtils;

/**
 * 将数据库查出的对象映射到实体类
 * 
 * <p>暂时废弃</p>
 * 
 * @ClassName: MyResultSetExtractor 
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author yanjr  2016年5月5日 下午3:51:42
 */
public class MyResultSetExtractor<T> implements ResultSetExtractor<T> {
	
	/**
	 * 实体类类型(由构造方法自动赋值)
	 */
	private Class<T> clazz;
	
	/**
	 * 构造方法，根据实例类自动获取实体类类型
	 */
	@SuppressWarnings("unchecked")
	public MyResultSetExtractor(Class<?> entityClass) {
		this.clazz = (Class<T>) entityClass;
	}

	@Override
	public T extractData(ResultSet rs) throws SQLException, DataAccessException {
		Field field = null;
		try {
			// 取得ResultSet列名
			ResultSetMetaData rsMetaData = (ResultSetMetaData) rs.getMetaData();
			// 获取记录集中的列数
			int columnCount = rsMetaData.getColumnCount();
			// 定义counts个String 变量
			String[] columnNames = new String[columnCount];
			// 给每个变量赋值
			for (int i = 0; i < columnCount; i++) {
				columnNames[i] = rsMetaData.getColumnLabel(i + 1);
			}
			// 变量ResultSet
			while (rs.next()) {
				T t = clazz.newInstance();
				
				// 反射, 从ResultSet绑定到JavaBean
				for(int i = 0; i < columnCount; i++) {
					// 根据 rs 列名 ，组装javaBean里边的其中一个set方法，object 就是数据库第一行第一列的数据了
					Object value = rs.getObject(columnNames[i]);
		
					//这里是获取数据库字段的类型
					Class<?> dbType = value.getClass();
					//设置参数类型，此类型应该跟javaBean 里边的类型一样，而不是取数据库里边的类型
					field = clazz.getDeclaredField(columnNames[i]);
					Class<?> beanType = field.getType();
					if(dbType.toString().indexOf("java.sql.Date") > 0 && beanType.toString().indexOf("java.util.Date") > 0) {
						value = new Date(rs.getDate(columnNames[i]).getTime());
					} else if(beanType!=dbType){
						//如果发生从数据库获取到得类型跟javaBean类型不同，按String类型取吧
						value = rs.getString(columnNames[i]);
					}
					String setMethodName = "set" + CamelCaseUtils.firstUpperCase(columnNames[i]);
					
//					System.out.println(">>>>>value=" + value);
//					System.out.println(">>>>>beanType=" + beanType);
//					System.out.println(">>>>>dbType=" + dbType.toString());
					
					// 第一个参数是传进去的方法名称，第二个参数是 传进去的类型；
					Method m = t.getClass().getMethod(setMethodName,beanType);
					// 第二个参数是传给set方法数据；如果是get方法可以不写
					m.invoke(t, value);
				}
				return t;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} 
		return null;
	}
	


}
